Map interface and its implementations
Map은 실제로 많이 사용되는 객체이지요. 이번에는 Map에 대해 써 볼까 합니다. Set을 자세히 알기 위해서도 먼저 Map을 알아두는 것이 좋다고 생각이됩니다. 왜냐면 Set의 구현체들 HashSet, TreeSet등등은 내부적으로 Map의 구현체들을 각각 사용하여 요소들을 저장 및 추출하고, 정렬하기때문입니다.
Map의 특성
Key, Value의 Entry 구조
Map의 요소는 key, value형태의 구조를 가지며, Entry라는 타입으로 Map에 저장됩니다. 고유한 key와 1:1로 매핑되는 value를 가지는 것이죠.
Elements and auto-boxing
key, value 모두 primitive, Object 타입을 받을 수 있는 것 처럼 보이지만 실제론 그렇지 않습니다. primitive type의 변수를 key 혹은 value로 입력할 경우 내부적으로 입력한 primitive type과 매핑되는 Wrapper Object 타입으로 auto-boxing이 이루어 집니다. 그 이유는 Map의 put, get, containsKey, containsValue등의 메서드를 보면 알 수 있지 않나 생각됩니다. 각각의 메서드는 인자로 Object 타입을 받습니다.
아래의 예제를 보면 알 수 있습니다. key, value로 int 형의 1,2를 각각 입력했습니다.
하지만 get 메서드에 의해 반환된 value의 타입을 보면 int의 Wrapper인 Integer입니다. 즉, 내부적으로 auto-boxing이 일어난겁니다.
별거 아닌거 같지만 auto-boxing, un-boxing은 속도에 영향을 미칩니다. 되도록이면 key, value입력시에 primitive type은 해당 Wrapper로 변환하여 입력하는 것이 좋을 것으로 생각됩니다.
auto-boxing sample code
public class MapAutoboxingTestDrive{
Map<Integer, Integer> autoboxingMap = new HashMap<Integer,Integer>();
autoboxingMap.put(1, 1);
autoboxingMap.put(2, 2);
if(autoboxingMap.containsKey(1)){
System.out.println("autoboxing occur for 1");
System.out.println("return type of value returned by get" + autoboxingMap.get(1).getClass().getName());
}
}
auto-boxing sample output
autoboxing occur for 1
return type of value returned by getjava.lang.Integer
중복된 Key
Map 객체는 중복된(동일한 hashCode를 가지는) key를 허용하지 않습니다. key로 사용될 객체의 hashCode값을 비교하여 해당 키가 있으면 value를 새로이 넣어 값을 갱신시켜버리고 이전 value객체는 반환을 해줍니다. 자세한 것은 HashMap 부분에서 다루도록 하겠습니다.
내부 Collection View
Map객체는 내부적으로 키값들의 집합, 값들의 집합 그리고 요소들의 집합, 이렇게 세개의 Collection view들을 가지고 있습니다.